package com.edu.exam.entity.grading.analysis;

import com.edu.exam.enums.grading.AnalysisTaskType;
import com.edu.exam.enums.grading.GradingTaskStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 分析任务实体类
 * 所属模块：E-03 成绩分析模块
 *
 * <p>分析任务实体用于存储和管理成绩数据分析任务信息，包含
 * 任务配置、执行状态、进度跟踪等功能。支持多种分析类型和执行策略。</p>
 *
 * <p>核心功能：
 * - 任务管理：创建、配置、调度分析任务
 * - 状态跟踪：跟踪任务执行状态和进度
 * - 优先级管理：支持任务优先级设置
 * - 时间管理：记录任务执行时间信息
 * - 版本控制：支持任务配置版本管理</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Accessors(chain = true)
public class AnalysisTask {

    /**
     * 任务唯一标识
     */
    @Id
    @Column(name = "task_id", length = 64)
    private String taskId;

    /**
     * 任务名称
     *
     * <p>任务的显示名称，用于用户识别和搜索。</p>
     */
    @Column(name = "task_name", length = 255)
    private String taskName;

    /**
     * 任务类型
     *
     * <p>分析任务的类型，决定使用的分析方法和算法。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_type", nullable = false, length = 32)
    private AnalysisTaskType taskType;

    /**
     * 分析范围
     *
     * <p>JSON格式的分析范围配置，定义数据的范围和条件。</p>
     */
    @Column(name = "analysis_scope", columnDefinition = "TEXT")
    private String analysisScope;

    /**
     * 分析配置
     *
     * <p>JSON格式的分析配置参数，包含算法参数和选项。</p>
     */
    @Column(name = "analysis_config", columnDefinition = "TEXT")
    private String analysisConfig;

    /**
     * 任务状态
     *
     * <p>任务执行的当前状态。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_status", nullable = false, length = 32)
    private GradingTaskStatus taskStatus = GradingTaskStatus.CREATED;

    /**
     * 任务优先级
     *
     * <p>任务执行优先级，数值越小优先级越高。</p>
     */
    @Column(name = "priority", nullable = false)
    private Integer priority = 5;

    /**
     * 任务进度
     *
     * <p>任务执行进度，百分比形式。</p>
     */
    @Column(name = "progress")
    private Integer progress = 0;

    /**
     * 开始时间
     *
     * <p>任务实际开始执行的时间。</p>
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 结束时间
     *
     * <p>任务完成或失败的时间。</p>
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 预计完成时间
     *
     * <p>任务预计完成的时间。</p>
     */
    @Column(name = "estimated_time")
    private LocalDateTime estimatedTime;

    /**
     * 任务描述
     *
     * <p>任务的详细描述信息。</p>
     */
    @Column(name = "task_description", columnDefinition = "TEXT")
    private String taskDescription;

    /**
     * 任务标签
     *
     * <p>任务的分类标签，用于分组和过滤。</p>
     */
    @Column(name = "task_tags", length = 500)
    private String taskTags;

    /**
     * 错误信息
     *
     * <p>任务执行失败时的错误信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 执行结果摘要
     *
     * <p>任务执行结果的简要描述。</p>
     */
    @Column(name = "result_summary", length = 1000)
    private String resultSummary;

    /**
     * 重试次数
     *
     * <p>任务失败后的重试次数。</p>
     */
    @Column(name = "retry_count")
    private Integer retryCount = 0;

    /**
     * 最大重试次数
     *
     * <p>允许的最大重试次数。</p>
     */
    @Column(name = "max_retry_count")
    private Integer maxRetryCount = 3;

    /**
     * 执行节点
     *
     * <p>任务执行的服务器节点标识。</p>
     */
    @Column(name = "execution_node", length = 100)
    private String executionNode;

    /**
     * 执行环境
     *
     * <p>任务执行的环境信息。</p>
     */
    @Column(name = "execution_environment", length = 100)
    private String executionEnvironment;

    /**
     * 依赖任务
     *
     * <p>JSON格式的依赖任务ID列表。</p>
     */
    @Column(name = "dependent_tasks", columnDefinition = "TEXT")
    private String dependentTasks;

    /**
     * 资源需求
     *
     * <p>JSON格式的资源需求配置。</p>
     */
    @Column(name = "resource_requirements", columnDefinition = "TEXT")
    private String resourceRequirements;

    /**
     * 超时时间（分钟）
     *
     * <p>任务执行的超时时间限制。</p>
     */
    @Column(name = "timeout_minutes")
    private Integer timeoutMinutes;

    // ===== 审计字段 =====

    /**
     * 创建人
     */
    @Column(name = "created_by", length = 64)
    private String createdBy;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新人
     */
    @Column(name = "updated_by", length = 64)
    private String updatedBy;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    /**
     * 版本号
     *
     * <p>任务配置的版本号，用于并发控制。</p>
     */
    @Version
    @Column(name = "version", nullable = false)
    @Builder.Default
    private Integer version = 0;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    @Builder.Default
    private Boolean isDeleted = false;

    // ===== 枚举定义 =====



    
    }